#include <iostream>
#include <string>
#include <regex>

int main()
{
    //HTTP请求行格式：  GET /c++/login?user=xiaoming&pass=123123 HTTP/1.1\r\n
    std::string str = "GET /c++/login?user=xiaoming&pass=123123 HTTP/1.1\r\n";
    std::smatch matches;
    //请求方法的匹配  GET HEAD POST PUT DELETE ....
    std::regex e(R"((GET|HEAD|POST|PUT|DELETE) ([^?]*)(?:\?(.*))? (HTTP/1\.[01])(?:\n|\r\n)?)", std::regex::icase);
    //GET|HEAD|POST|PUT|DELETE   表示匹配并提取其中任意一个字符串
    //[^?]*     意思就是匹配？前面的字符。[^?]匹配非问号字符， 后边的*表示0次或多次。
    //\?(.*)    因为?单个字符具有特殊含义，所以\?其实就表示为问号，并且没有任何转意的意思。
    //          .*：表示为任何字符或字符串，后面有一个空格，然后其实就匹配？——空格的那一部分内容，且它不提取？
    //[01]      表示0或者1  

    //(pattern) - 捕获组：提取内容
    //(?:pattern) - 非捕获组：只匹配不提取，matches不会出现()里的内容
    //只有被 () 包围的部分才会出现在 matches 结果中
    //(?:A(B)C)：ABC不会出现在 matches 中，只有内部的捕获组 (B) 会出现在 matches
    
    //()?：()里的内容出现出现0次或1次

    //matches: 从matches[1]开始，GET，/bitejiuyeke/login，user=xiaoming&pass=123123，HTTP/1.1

    bool ret = std::regex_match(str, matches, e);
    if (ret == false) {
        return -1;
    }
    std::string method = matches[1];
    std::transform(method.begin(), method.end(), method.begin(), ::toupper);
    std::cout << method << std::endl;
    for (int i = 0; i < matches.size(); i++) {
        std::cout << i << " : ";
        std::cout << matches[i] << std::endl;
    }
    return 0;
}